#include <iostream>
#include <string>
using namespace std;
//class Person
//{
//public:
//    string _name; // 姓名
//};
//class Student : virtual public Person
//{
////protected:
//public:
//    int _num=10; //学号
//    int _addres=12;
//};
//class Teacher : virtual public Person
//{
////protected:
//public:
//    int _id=11; // 职工编号
//};
//class Assistant : public Student, public Teacher
//{
//protected:
//    //string _majorCourse="张三"; // 主修课程
//};
//
//int main()
//{
//    // 这样会有二义性无法明确知道访问的是哪一个
//    Assistant a;
//    a._name = "_name";
//    // 数据冗余 和 二义性
//    a.Student::_name = "小张";
//    a.Teacher::_name = "老张";
//}





//
//class Person {
//public:
//	virtual void BuyTicket() { cout << "买票-全价" << endl; }
//
//	virtual ~Person()
//	{
//		cout << "~Person()" << endl;
//	}
//};
//
//class Student : public Person {
//public:
//	void BuyTicket() { cout << "买票-半价" << endl; }
//
//	~Student()
//	{
//		cout << "~Student()" << endl;
//	}
//};
//
//
//void Func(Person* p)
//{
//	// 1、不满足多态 -- 看调用者的类型，调用这个类型的成员函数
//	// 2、满足多态   -- 看指向的对象的类型，调用这个类型的成员函数
//	p->BuyTicket();
//
//	delete p;
//}
//void Func2(Person& p)
//{
//	// 1、不满足多态 -- 看调用者的类型，调用这个类型的成员函数
//	// 2、满足多态   -- 看指向的对象的类型，调用这个类型的成员函数
// 	p.BuyTicket();
//}

//void test1()
//{
//	Func(new Person);
//	Func(new Student);
//	Person ps;
//	Student st;
//
//	Func2(ps);
//	Func2(st)
//}


//class Person {
//public:
//	virtual Person* BuyTicket()
//	{
//		cout << "买票-全价" << endl;
//		return nullptr;
//	}
//};
//class Student : public Person {
//public:
//	virtual Student* BuyTicket()
//	{
//		cout << "买票-半价" << endl;
//		return nullptr;
//	}
//};
//
//void Func(Person* p)
//{
//    p->BuyTicket();
//	delete p;
//}
//
//void test2()
//{
//	Func(new Person);
//	Func(new Student);
//}
//
////试题
//class A
//{
//public:
//	virtual void func(int val = 1){ std::cout << "A->" << val << std::endl; }
//    virtual void test(){ func(); }
//};
//class B : public A
//{
//public:
//	void func(int val = 0){ std::cout << "B->" << val << std::endl; }
//};
//int main(int argc, char* argv[])
//{
//	B*p = new B;
//	p->test();
//	return 0;
//}

//// 这里常考一道笔试题：sizeof(Base)是多少？
//class Base
//{
//public:
//	virtual void Func1()
//	{
//		cout << "Func1()" << endl;
//	}
//
//private:
//	int _b = 1;
//	char _ch;
//};
//void test3()
//{
//    cout << sizeof(Base)<<endl;
//    Base bb;
//}
//class A
//{
//public:
//    void f1(){cout<<"A::f1()"<<endl;}
//    virtual void f2(){cout<<"A::f2()"<<endl;}
//    virtual void f3(){cout<<"A::f3()"<<endl;}
//};
//
//class B : public A
//{
//public:
//    virtual void f1(){cout<<"B::f1()"<<endl;}
//    virtual void f2(){cout<<"B::f2()"<<endl;}
//    void f3(){cout<<"B::f3()"<<endl;}
//};
//int main()
//{
//    A *a = new B;//A指向B，调用时用B
//    a->f1();
//}

class A
{
public:
    A ():m_iVal(0){test();}
    virtual void func() { std::cout<<m_iVal<<" ";}
    void test(){func();}
public:
    int m_iVal;
};

class B : public A
{
public:
    B(){test();}
    virtual void func()
    {
        ++m_iVal;
        std::cout<<m_iVal<<" ";
    }
};

int main(int argc ,char* argv[])
{
    A*p = new B;
    p->test();
    return 0;
}
//int main()
//{
//    //test1();
//    //test2();
//    test3();
//    return 0;
//}